package com.example.leo.mycharmingstudent.a0905;

import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;

import java.lang.ref.WeakReference;

/**
 * Created by Leo on 2020/9/5.
 */

/**
 * 将下载任务抽取/封装成一个类
 * 封装接地理解：
 * 一个地方写代码，多个地方使用
 *
 * 回调思想：
 * 本质就是对象调用方法
 *
 * 将一个IDownLoadListener对象传入到DownLoadTask里面，
 * 就可以使用IDownLoadListener对象调用方法（回调方法）
 */
public class DownLoadTask extends AsyncTask<String, Integer, String> {

    private static final String TAG = "DownLoadTask";

    private WeakReference<Context> mReference;

    public DownLoadTask(Context context,IDownLoadListener downLoadListener) {
        this.mReference = new WeakReference<Context>(context);
        this.mDownLoadListener = downLoadListener;
    }

    /**
     * 主线程
     * 在执行具体任务之前，做一些事情
     * 举个栗子：
     * 网络请求之前，toast提示一下，加载一个旋转等待框
     */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        ToastUtil.showToast(mReference.get(), "准备开始执行任务");
        mDownLoadListener.preDownLoad();
    }

    /**
     * 子线程
     * 执行具体任务
     * 此处报错了：
     * java.lang.RuntimeException: An error occurred while executing doInBackground()
     * Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
     * 子线程中，不得更新UI，或者进行UI操作
     *
     * 如何让doInBackground方法停止运行？
     * 通过isCancelled方法，获取mCancelled标志位。
     * 如果mCancelled为true，手动停止doInBackground方法的执行
     */
    @Override
    protected String doInBackground(String... params) {
        return mDownLoadListener.downLoad(this);
    }

    /**
     * 主线程
     * 进度更新
     * java.util.UnknownFormatConversionException: Conversion = 'End of String'
     * 为什么报这个错。
     * String.format()方法：%表示格式化的字符，单用%会报上面的错误
     * 如果想展示一个%，需要用两个%%表示。
     *
     * onProgressUpdate方法，在AsyncTask调用cancel方法以后就不执行了。
     */
    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        mDownLoadListener.progress(values);
    }

    /**
     * 主线程
     * 处理任务的结果
     */
    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        ToastUtil.showToast(mReference.get(), "下载完成");
        mDownLoadListener.complete(s);
    }

    /**
     * 主线程
     * 取消任务
     * 先于onCancelled(String s)调用
     */
    @Override
    protected void onCancelled() {
        super.onCancelled();
        ToastUtil.showToast(mReference.get(), "onCancelled()");
        mDownLoadListener.cancel();
    }

    private IDownLoadListener mDownLoadListener;

    public void setDownLoadListener(IDownLoadListener listener){
        this.mDownLoadListener = listener;
    }

    public interface IDownLoadListener{
        void preDownLoad();
        String downLoad(DownLoadTask task);
        void progress(Integer... values);
        void complete(String result);
        void cancel();
    }
}
